package com.soul.dubbo.api.mongo;

import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import com.soul.model.mongo.Visitors;
import com.soul.model.vo.PageResult;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.data.mongodb.core.query.UpdateDefinition;

import java.util.Date;
import java.util.List;

/**
 * @author mdoya
 * @version 1.0
 * @description:
 */
@Slf4j
@DubboService
public class VisitorApiImpl implements VisitorApi{

    @Autowired
    private MongoTemplate mongoTemplate;

    /**
     * 添加访问记录
     *
     * @param visitors 访问记录对象
     */
    @Override
    public void addVisitors(Visitors visitors) {
        Query query = new Query();
        Date date = new Date();
        Long nowTime = date.getTime();
        visitors.setDate(nowTime); // 时间毫秒值
        visitors.setVisitDate(DateUtil.format(date,"yyyyMMdd")); // 当前系统时间转为  20220213
        // 1. 查询用户是否有上一次访问记录  有上一次访问记录  条件构造
        query.addCriteria(Criteria.where("userId").is(visitors.getUserId()).and("visitorUserId").is(visitors.getVisitorUserId()).and("visitDate").is(visitors.getVisitDate()));
        if (mongoTemplate.exists(query,Visitors.class)){
            // 2. 有上一次访问记录  更新访问记录
            Update update = new Update();
            update.set("from",visitors.getFrom()); // 来源哪里： 首页
            update.set("date",nowTime); // 当前系统时间毫秒值
            mongoTemplate.updateFirst(query,update,Visitors.class);
            return;
        }
        // 3. 没有上一次访问记录，则新增访问记录
        mongoTemplate.insert(visitors);
    }

    /**
     * 查询当前被访问用户
     *
     * @param userId 当前用户id
     * @return List<Visitors>
     */
    @Override
    public List<Visitors> findVisitors(Long userId,Long lastTime) {
        // 1. 构造查询条件
        Query query = new Query();
        query.addCriteria(Criteria.where("userId").is(userId));
        query.limit(5);
        query.with(Sort.by(Sort.Direction.DESC,"date"));
        if (lastTime != null){ // redis中数据不一定有
            query.addCriteria(Criteria.where("date").is(lastTime));
        }
        // 2. 执行查询语句
        return mongoTemplate.find(query,Visitors.class);
    }

    /**
     * 用户查询被访问用户
     *
     * @param currendUserId
     * @param page
     * @param pagesize
     * @return
     */
    @Override
    public PageResult<Visitors> findFriendFollowPage(Long currendUserId, Long page, Long pagesize) {
        Query query = new Query();
        query.addCriteria(Criteria.where("userId").is(currendUserId));
        long count = mongoTemplate.count(query, Visitors.class);
        query.skip((page - 1) * pagesize).limit(pagesize.intValue());
        query.with(Sort.by(Sort.Direction.DESC,"date"));
        List<Visitors> visitorsList = mongoTemplate.find(query, Visitors.class);
        return new PageResult<>(page,pagesize,count,visitorsList);
    }
}
